/**
 * Copyright (C), 2020, Y2 T205
 * FileName: CartInterceptor
 * Author: Lenovo
 * Date: 2020-05-26 21:38
 * Description: 在执行目标方法之前，判读用户的登录状态
 * History:
 * <author> <time> <version> <desc>
 * 作者姓名 修改时间 版本号 描述
 */


package com.atguigu.gulimall.cart.interceptor;


import com.atguigu.common.constant.AuthServerConstant;
import com.atguigu.common.constant.CartConstant;
import com.atguigu.common.vo.MemberRespVo;
import com.atguigu.gulimall.cart.vo.UserInfoTo;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.UUID;

/**
 * 〈一句话功能简述〉<br>
 * 〈在执行目标方法之前，判读用户的登录状态〉
 * 并封装传递给目标的请求
 *
 * @author Lenovo
 * @create 2020-05-26
 * @since 1.0.0
 */

public class CartInterceptor implements HandlerInterceptor {


//    引入threadlocal共享数据
    public static ThreadLocal<UserInfoTo> threadLocal =new ThreadLocal<>();

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       UserInfoTo userInfoTo =new UserInfoTo();
       HttpSession session = request.getSession();
       MemberRespVo member = (MemberRespVo)session.getAttribute(AuthServerConstant.LOGIN_USER);
       if(member!=null) {
             userInfoTo.setUserId(member.getId());
       }
           Cookie[] cookies = request.getCookies();
           if(cookies!=null && cookies.length>0){
               for(Cookie cookie:cookies){
                   //               user-key
                   String name = cookie.getName();
                   if(name.equals(CartConstant.TEMP_USER_COOKIE_NAME)){
                       userInfoTo.setUserkey(cookie.getValue());
                       userInfoTo.setTempUser(true);
                   }
               }



           }


//           如果没有临时用户一定分配一个临时用户
       if(StringUtils.isEmpty(userInfoTo.getUserkey())){
           String uuid = UUID.randomUUID().toString();
           userInfoTo.setUserkey(uuid);
       }
//           用户登录
       //目标方法执行之前
       threadLocal.set(userInfoTo);
       return true;
       }
//浏览器执行之前要存储信息
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        UserInfoTo userInfoTo = threadLocal.get();

//持续延长临时用户的过期时间
//        如果没有临时用户一定保存
        if(!userInfoTo.isTempUser()){
//            持续的延长临时用户的过期时间
            Cookie cookie =new Cookie(CartConstant.TEMP_USER_COOKIE_NAME,userInfoTo.getUserkey());
            cookie.setDomain("gulimall.com");
            cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIMEOUT);
            response.addCookie(cookie);
        }

    }
}


